package com.zyf;

import java.util.Scanner;

/**
 * 10 加一

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一,
最高位数字存放在数组的首位,数组中每个元素只存储一个数字
你可以假设除了整数0之外,这个整数不会以 零 开头

示例 1 
输入 :  {1,2,3}
输出 :  {1,2,4}
解释 :  输入数组表示数字 123.
示例 2
输入 :  {4,3,2,1}
输出 :  {4,3,2,2}
解释 :  输入数组表示数字 4321.

 * @author lenovo
 * @Date 2020年7月2日
 * @Time 下午4:23:06
 */
public class _10_plusOne {

	public static void main(String[] args) {
		@SuppressWarnings("resource")
		Scanner sc = new Scanner(System.in);
		System.out.println("输入一个数组长度 : " );
		int n = sc.nextInt();
		int[] arr1 = new int[n];
		System.out.println("输入一个长度为 " + n +"的数组 : " );
		for (int i = 0; i < arr1.length; i++) {
			arr1[i] = sc.nextInt();
		}
		int[] arr2 = plusOne(arr1);
		System.out.println("加一后为 : ");
		for (int i : arr2) {
			System.out.print(i + " " );
		}
	}
	/**
	 * 加一方法
	 * @param arr1
	 * 
	 * 思路:
	 * 找到数组最后一个值 ++ 即可
	 * 考虑到进位
	 * 三种情况:
	 * 1 最后一个值为 9 则将其置 0 倒数第二个元素 ++
	 * 2 中间元素为 9 接收进位后将其 置 0 ,同时将前边一个元素 ++
	 * 3 第一个元素为 9 ,则将数组扩大一位,首位是 1
	 * 
	 */
	public static int[] plusOne(int[] arr1) {
		int n = arr1.length;//n 表示数组的长度 , 用来开辟新数组
		int n1 = arr1.length-1;//n1 表示数组最后一个元素
		arr1[n1] += 1;
		//如果大于 9 ,那么会产生进位
		if (arr1[n1] > 9) {
			while(n1 > 0 && arr1[n1] > 9) {
				arr1[n1] = 0;
				arr1[--n1] ++; 
			}
			//情况 3 :开辟新的数组空间并且首位为1
			if (n1 == 0 && arr1[n1] > 9) {
				arr1 = new int[n + 1];
				arr1[0] = 1;
			}
		}
		return arr1;
		
	}
}